// 论坛帖子
// by indraw 2013.02.01
package bbs

import (
	//"fmt"
    "strings"
    "strconv"
    "utils/mgo/bson"
    "utils/util"
    "regexp"
	"encoding/hex"
)

//用户分组
type Post struct{
    Dao
    PostData
}

//论坛动作
type PostData struct{
    Pid bson.ObjectId "_id"  //帖子id
    Tid string   //所属主题
    Fid int   //所属板块
    First  int    //是否为主题
    Userid string       //用户ID
    Username string      //发表人姓名
    Subject  string  //标题
    Content string   //内容
    Useip string   //使用的ip
    Usesig int   //使用签名
    Anonymous int   //使用匿名
    Allowhtml int   //使用html
    Allowubb int   //使用code
    Allowsmiley int   //使用表情符
    Allowurl int   //自动解析url
    Attachment string   //是否有附件
    Rate int   //评分
    Ratetimes int   //评分次数
    Credit int   //得分
    Modify string   //修改记录
    Status int   //状态
}

//论坛动作
type PostDataList struct{
    Post PostData
    User *UserData
    Group GroupUserData
}

/**
 * 初始化对象
 *
 * author: indraw
 * date: 2013-02-11
 */
func newPost() *Post {
    
    c := &Post{
        Dao{
            c:db.C("post"),
        },
        PostData{
		    Pid:bson.NewObjectId(),  //帖子id
		    Tid:"",   //所属主题
		    Fid:0,   //所属板块
		    First:0,    //是否为主题
		    Userid:"",       //用户ID
		    Username:"",      //发表人姓名
		    Subject:"",  //标题
		    Content:"",   //内容
		    Useip:"",   //使用的ip
		    Usesig:0,   //使用签名
		    Anonymous:0,   //使用匿名
		    Allowhtml:0,   //使用html
		    Allowubb:0,   //使用code
		    Allowsmiley:0,   //使用表情符
		    Allowurl:0,  //自动解析url
		    Attachment:"",   //是否有附件
		    Rate:0,   //评分
		    Ratetimes:0,   //评分次数
		    Credit:0,   //得分
		    Modify:"",   
        },
    }
    return c
}


/**
 * 设置帖子ID
 *
 * author: indraw
 * date: 2013-02-11
 */
func (p *Post) setPid( pid string ) {
    
    if m, _ := regexp.MatchString("^[a-zA-Z0-9]+$", pid); !m {
        p.newError("请填写帖子ID")
        return
    }
    p.Pid = bson.ObjectIdHex(pid)
}

/**
 * 设置帖子ID
 *
 * author: indraw
 * date: 2013-02-11
 */
func (p *Post) getPid() ( string ) {
    
    return hex.EncodeToString([]byte(p.Pid))
}

/**
 * 设置板块ID
 *
 * author: indraw
 * date: 2013-02-11
 */
func (p *Post) setFid( fid string ) {
    
    if m := util.CheckNumber(fid); !m {
        p.newError("请填写板块ID")
        return
    }
    p.Fid,_ = strconv.Atoi(fid)
}

/**
 * 设置主题ID
 *
 * author: indraw
 * date: 2013-02-11
 */
func (p *Post) setTid( tid string ) {
    
    if m, _ := regexp.MatchString("^[a-zA-Z0-9]+$", tid); !m {
        p.newError("请填写主题ID")
        return
    }
    p.Tid = tid
}


/**
 * 设置用户ID
 *
 * author: indraw
 * date: 2013-02-11
 */
func (p *Post) setUserid( userid string ) {
    
    if m, _ := regexp.MatchString("^[a-zA-Z0-9]+$", userid); !m {
        p.newError("请填写userid")
        return
    }
    p.Userid = userid
}

/**
 * 设置用户Name
 *
 * author: indraw
 * date: 2013-02-11
 */
func (p *Post) setUsername( username string ) {
    
    username = strings.TrimSpace(username)
    if m := util.CheckLen(username,3); !m {
        p.newError("请填写用户名" + username)
        return
    }
    p.Username = username

}

/**
 * 设置标题
 *
 * author: indraw
 * date: 2013-02-11
 */
func (p *Post) setSubject( subject string ) {
    
    subject = strings.TrimSpace(subject)
    if m := util.CheckLen(subject,6); !m {
        p.newError("请填写标题，不可少于6个字符:")
        return
    }
    p.Subject = subject

}

/**
 * 设置内容
 *
 * author: indraw
 * date: 2013-02-11
 */
func (p *Post) setContent( content string ) {
    
    //content = strings.TrimSpace(content)
    if m := util.CheckLen(content,6); !m {
        p.newError("请填写内容，不可少于6个字符:")
        return
    }
    p.Content = content

}

/**
 * 设置用户ID
 *
 * author: indraw
 * date: 2013-02-11
 */
func (p *Post) setUsesig( usesig string ) {
    if usesig == ""{
        usesig = "0"
    }
    if m := util.CheckEnum(usesig); !m {
        p.newError("请填写签名信息")
        return
    }
    p.Usesig,_= strconv.Atoi(usesig)
}


/**
 * 写入数据库
 *
 * author: indraw
 * date: 2013-02-11
 */
func (p *Post) add() error {
    //判断错误
    if err := p.ckError(); err != nil {
        return err
    }

    //执行写入
    if  err := p.c.Insert(&p.PostData); err != nil {
        return err
    }
    return nil
}

/**
 * 获取一条记录
 *
 * author: indraw
 * date: 2013-02-11
 */
func (p *Post) get() error {
    //fmt.Println("user.go")
    
    return nil
}


/**
 * 分页获取记录
 *
 * author: indraw
 * date: 2013-02-11
 */
func (p *Post) list(page *util.PageMaker) []PostData {
    //fmt.Println("user.go")
    //判断是否重复
    var l []PostData
    p.c.Find(bson.M{"tid": p.Tid}).Sort("_id").Skip(page.Begin).Limit(page.PerPage).All(&l)

    
    return l
    
}


/**
 * 分页获取记录
 *
 * author: indraw
 * date: 2013-02-11
 */
func (p *Post) listMore(page *util.PageMaker) []PostDataList {
    //fmt.Println("user.go")
    //判断是否重复
    var l []PostData
    p.c.Find(bson.M{"tid": p.Tid}).Sort("_id").Skip(page.Begin).Limit(page.PerPage).All(&l)

	//循环并获取用户信息
    var l2 []PostDataList
    var aUserid []bson.ObjectId
    for _,v := range l{
		aUserid = append(aUserid,bson.ObjectIdHex(v.Userid))
		//fmt.Println(bson.ObjectIdHex(v.Userid))
	}
	var u []UserData
	p.c = db.C("user")
	p.c.Find(bson.M{"_id": bson.M{"$in": aUserid}}).All(&u)
	p.c = db.C("post")
	//将用户信息赋给每一条帖子
	for _,v := range l{
		var user UserData

		//fmt.Println(v.Userid)

		for _,v2 := range u{


			getuserid := hex.EncodeToString([]byte(v2.Userid))

			//fmt.Println("-" + getuserid)


			if getuserid == v.Userid{
				user = v2
				//
				
			}
		}
		//fmt.Println(user.Groupid)
		l3 := PostDataList{Post:v,
							User:&user,
							Group:SysGroup[user.Groupid],
							}
		l2 = append(l2,l3)
	}

    return l2
    
}

/**
 * 删除一条记录
 *
 * author: indraw
 * date: 2013-02-11
 */
func (p *Post) count() int {
    var n int
    n,err := p.c.Find(bson.M{"tid": p.Tid}).Count()
    if err != nil{
        n = 0
    }
    
    return n
}

/**
 * 获取前多少条记录
 *
 * author: indraw
 * date: 2013-02-11
 */
func (p *Post) top() []PostData {
    var l []PostData
    p.c.Find(bson.M{"tid": p.Tid}).Sort("_id").All(&l)

    return l
}

/**
 * 更新一条记录
 *
 * author: indraw
 * date: 2013-02-11
 */
func (p *Post) update() error {
    //fmt.Println("user.go")
    
    return nil
}

/**
 * 删除一条记录
 *
 * author: indraw
 * date: 2013-02-11
 */
func (p *Post) delete() error {
    //fmt.Println("user.go")
    
    return nil
}


